/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BackEnd;

import BackEnd.Exceptions.CreateRegisterException;
import BackEnd.Exceptions.NotExistRegisterException;
import java.util.ArrayList;
import java.util.Date;
import Dao.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author emmanuel
 */
public class Post {

    private long id;
    private String titulo;
    private Date fechaCreacion;
    private String contenido;
    private Date fechaBorrado;
    private Usuario moderador;
    private Usuario usuario;
    private String motivoModeracion;
    private Date fechaModeracion;
    private ArrayList<Categoria> categorias;
    private ArrayList<ComentarioPost> comentarios;

    public Post(String t, String c, ArrayList<Categoria> ca) {
        this.id = 0;
        this.titulo = t;
        this.fechaCreacion = new Date();
        this.contenido = c;
        this.fechaBorrado = null;
        this.moderador = null;
        this.usuario=null;
        this.motivoModeracion = "";
        this.fechaModeracion = null;
        this.categorias = ca;
        this.comentarios = new ArrayList<ComentarioPost>();
    }

    public Post() {
        this("post predeterminado", "Contenido Genérico", new ArrayList<Categoria>());
    }

    /**
     * @return the titulo
     */
    public String getTitulo() {
        return titulo;
    }

    /**
     * @param titulo the titulo to set
     */
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    /**
     * @return the fechaCreacion
     */
    public Date getFechaCreacion() {
        return fechaCreacion;
    }

    /**
     * @param fechaCreacion the fechaCreacion to set
     */
    public void setFechaCreacion(Date fechaCreacion) {
        this.fechaCreacion = fechaCreacion;
    }

    /**
     * @return the contenido
     */
    public String getContenido() {
        return contenido;
    }

    /**
     * @param contenido the contenido to set
     */
    public void setContenido(String contenido) {
        this.contenido = contenido;
    }

    /**
     * @return the fechaBorrado
     */
    public Date getFechaBorrado() {
        return fechaBorrado;
    }

    /**
     * @param fechaBorrado the fechaBorrado to set
     */
    public void setFechaBorrado(Date fechaBorrado) {
        this.fechaBorrado = fechaBorrado;
    }

    /**
     * @return the moderador
     */
    public Usuario getModerador() {
        return moderador;
    }

    /**
     * @param moderador the moderador to set
     */
    public void setModerador(Usuario moderador) {
        this.moderador = moderador;
    }

    /**
     * @return the motivoModeracion
     */
    public String getMotivoModeracion() {
        return motivoModeracion;
    }

    /**
     * @param motivoModeracion the motivoModeracion to set
     */
    public void setMotivoModeracion(String motivoModeracion) {
        this.motivoModeracion = motivoModeracion;
    }

    /**
     * @return the fechaModeracion
     */
    public Date getFechaModeracion() {
        return fechaModeracion;
    }

    /**
     * @param fechaModeracion the fechaModeracion to set
     */
    public void setFechaModeracion(Date fechaModeracion) {
        this.fechaModeracion = fechaModeracion;
    }

    /**
     * @return the categorias
     */
    public ArrayList<Categoria> getCategorias() {
        return categorias;
    }

    /**
     * @param categorias the categorias to set
     */
    public void setCategorias(ArrayList<Categoria> categorias) {
        this.setCategorias(categorias);
    }

    /**
     * @return the comentarios
     */
    public ArrayList<ComentarioPost> getComentarios() {
        return comentarios;
    }

    /**
     * @param comentarios the comentarios to set
     */
    public void setComentarios(ArrayList<ComentarioPost> comentarios) {
        this.setComentarios(comentarios);
    }

    public void agregarComentario(ComentarioPost cp) {
        this.comentarios.add(cp);
    }

    public void quitarComentario(ComentarioPost cp) {
        this.comentarios.remove(cp);
    }

    public boolean abrir(long id) {

        try {

            PostValueObject pvo = (PostValueObject) new PostDao().traer(new PkId((int) id));

            this.setId(pvo.getId());
            this.setContenido(pvo.getContenido());
            this.setFechaBorrado(pvo.getFechaBorrado());
            this.setFechaModeracion(pvo.getFechaModeracion());
            this.setFechaCreacion(pvo.getFechaCreacion());

            Usuario mod=new Usuario();
            mod.abrir(pvo.getIdModerador());
            this.setModerador(mod);

            Usuario us=new Usuario();
            us.abrir(pvo.getIdUsuario());
            this.setUsuario(us);

            this.setMotivoModeracion(pvo.getMotivoModeracion());
            this.setTitulo(pvo.getTitulo());

            //******************************************//
            
            PostXCategoriaValueObject[] pxcvo=(PostXCategoriaValueObject[]) new PostXCategoriaDao().traerCategorias(pvo.getId());
            ArrayList<Categoria> cat=new ArrayList();
            Categoria AuxC=null;
            
            for(int i=0;i<pxcvo.length;i++)
            {
                AuxC=new Categoria();
                AuxC.abrir(pxcvo[i].getIdCategoria());
                cat.add(AuxC);
            }
            this.setCategorias(cat);

            //***************************************//

            ComentariopostValueObject cpvo[]=(ComentariopostValueObject[]) new ComentariopostDao().traerComentarios(pvo.getId());
            ArrayList<ComentarioPost> cp=new ArrayList();
            ComentarioPost AuxCP=null;
            for(int i=0;i<cpvo.length;i++)
            {
                AuxCP=new ComentarioPost();
                AuxCP.abrir(cpvo[i].getId());
                cp.add(AuxCP);
            }
            this.setComentarios(cp);




        } catch (NotExistRegisterException ex){
            Logger.getLogger(Post.class.getName()).log(Level.SEVERE, null, ex);
        }

        return false;
    }

    // LOS GRABAR DEBEN DISCRIMINAR SI ES UN OBJETO NUEVO PARA INSERTARLO EN LA
    // BASE DE DATOS O SI ES UN EXISTENTE PARA ACTUALIZARLO
    public void grabar() {

        PostValueObject pvo=new PostValueObject();
        pvo.setContenido(contenido);
        pvo.setFechaBorrado(fechaBorrado);
        pvo.setFechaCreacion(fechaCreacion);
        pvo.setId((int)id);
        pvo.setIdModerador((int)moderador.getId());
        pvo.setIdUsuario((int)usuario.getId());
        pvo.setMotivoModeracion(motivoModeracion);
        pvo.setTitulo(titulo);


        for(int i=0;i<comentarios.size();i++)
            comentarios.get(i).grabar();

        for(int i=0;i<categorias.size();i++)
            categorias.get(i).grabar();

        //lo haga para saber si debo actualizarlo o crearlo
        try {
            try {
                new PostDao().traer(new PkId((int)id));
                } catch (NotExistRegisterException ex){
                    new PostDao().create(pvo);
                }

             new PostDao().update(pvo);
            } catch (Exception ex1) {Logger.getLogger(Post.class.getName()).log(Level.SEVERE, null, ex1);}

    }

    /**
     * @return the id
     */
    public long getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(long id) {
        this.id = id;
    }

    /**
     * @return the usuario
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
}
